//package com.tgsoft.kdcloud.mybatis.interceptor;
//
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
//import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
//import net.sf.jsqlparser.JSQLParserException;
//import net.sf.jsqlparser.expression.Expression;
//import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
//import net.sf.jsqlparser.parser.CCJSqlParserUtil;
//import net.sf.jsqlparser.statement.select.PlainSelect;
//import net.sf.jsqlparser.statement.select.Select;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//
//import java.util.Map;
//
///**
// * 数据权限
// *
// * @author 阿沐 babamu@126.com
// * <a href="https://maku.net">MAKU</a>
// */
//public class DataScopeInnerInterceptor implements InnerInterceptor {
//
//    @Override
//    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
//        DataScope scope = getDataScope(parameter);
//        // 不进行数据过滤
//        if (scope == null || StrUtil.isBlank(scope.getSqlFilter())) {
//            return;
//        }
//
//        // 拼接新SQL
//        String buildSql = getSelect(boundSql.getSql(), scope);
//
//        // 重写SQL
//        PluginUtils.mpBoundSql(boundSql).sql(buildSql);
//    }
//
//    private DataScope getDataScope(Object parameter) {
//        if (parameter == null) {
//            return null;
//        }
//
//        // 判断参数里是否有DataScope对象
//        if (parameter instanceof Map<?, ?> parameterMap) {
//            for (Map.Entry<?, ?> entry : parameterMap.entrySet()) {
//                if (entry.getValue() != null && entry.getValue() instanceof DataScope) {
//                    return (DataScope) entry.getValue();
//                }
//            }
//        } else if (parameter instanceof DataScope) {
//            return (DataScope) parameter;
//        }
//
//        return null;
//    }
//
//    private String getSelect(String buildSql, DataScope scope) {
//        try {
//            Select select = (Select) CCJSqlParserUtil.parse(buildSql);
//            PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
//
//            Expression expression = plainSelect.getWhere();
//            if (expression == null) {
//                plainSelect.setWhere(new StringValue(scope.getSqlFilter()));
//            } else {
//                AndExpression andExpression = new AndExpression(expression, new StringValue(scope.getSqlFilter()));
//                plainSelect.setWhere(andExpression);
//            }
//
//            return select.toString();
//        } catch (JSQLParserException e) {
//            return buildSql;
//        }
//    }
//}